#include <iostream>
#include <string>
using namespace std;
class Base{
    public:
    virtual int f() const{
        cout << "Base::f()"<<endl;
        return 1;
    }
    virtual void f(string) const { }
    virtual void g() const{}
};

class Derived1: public Base{
public:
  void g() const{}
};

class Derived2: public Base{
public:
   int f() const{
     cout << "Derived2::f()"<<endl;
     return  2;
   }    
};

class Derived3: public Base{
    // public:
    //    void f() const{
    //      cout << "Derived3::f()"<<endl;
    //    }    
    // 不允许我们改变重新定义过的函数的返回值。如果不是虚函数则是允许的
    // 如果想要实现这个功能也是可行，但是这是一个特殊行为
};

class Derived4: public Base{
    public:
       int f(int) const{
         cout << "Derived4::f()"<<endl;
         return 4;
       }    
};

int main(){
    string s("hello");
    Derived1 d1;
    int x =d1.f();
    d1.f(s);
    Derived2 d2;
    x =d2.f();
    //! d2.f(s)    重新定义了f()方法一个版本，另一个版本没重定义，所以不能使用
    Derived3 d3;
    //!x =d3.f();
    d3.f();
    Derived4 d4;
    //!x =d4.f();
    x=d4.f(1);

    Base& br =d4;
    br.f();
    br.f(s);
}
